<?php
/**  摘自 discuz
 * $string 明文或密文
 * $operation 加密ENCODE或解密DECODE
 * $key 密钥
 * $expiry 密钥有效期 ， 默认是一直有效
 */
if(!function_exists("auth_code")){
	function auth_code($string, $operation = 'DECODE', $key = '', $expiry = 0) {
		/*
		 动态密匙长度，相同的明文会生成不同密文就是依靠动态密匙
		加入随机密钥，可以令密文无任何规律，即便是原文和密钥完全相同，加密结果也会每次不同，增大破解难度。
		取值越大，密文变动规律越大，密文变化 = 16 的 $ckey_length 次方
		当此值为 0 时，则不产生随机密钥
		*/
		$ckey_length = 4;
		$key = md5($key != '' ? $key : "fdsfdf43535svxfsdfdsfs"); // 此处的key可以自己进行定义，写到配置文件也可以
		$keya = md5(substr($key, 0, 16));
		$keyb = md5(substr($key, 16, 16));
		$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
		
		$cryptkey = $keya.md5($keya.$keyc);
		$key_length = strlen($cryptkey);
		// 明文，前10位用来保存时间戳，解密时验证数据有效性，10到26位用来保存$keyb(密匙b)，解密时会通过这个密匙验证数据完整性
		// 如果是解码的话，会从第$ckey_length位开始，因为密文前$ckey_length位保存 动态密匙，以保证解密正确
		$string = $operation == 'DECODE' ? base64_decode(substr(str_replace(array('-','_'),array('+','/'),$string), $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
		$string_length = strlen($string);
		
		$result = '';
		$box = range(0, 255);
		
		$rndkey = array();
		for($i = 0; $i <= 255; $i++) {
			$rndkey[$i] = ord($cryptkey[$i % $key_length]);
		}
		
		for($j = $i = 0; $i < 256; $i++) {
			$j = ($j + $box[$i] + $rndkey[$i]) % 256;
			$tmp = $box[$i];
			$box[$i] = $box[$j];
			$box[$j] = $tmp;
		}
		
		for($a = $j = $i = 0; $i < $string_length; $i++) {
			$a = ($a + 1) % 256;
			$j = ($j + $box[$a]) % 256;
			$tmp = $box[$a];
			$box[$a] = $box[$j];
			$box[$j] = $tmp;
			$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
		}
		
		if($operation == 'DECODE') {
			if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
				return substr($result, 26);
			} else {
				return '';
			}
		} else {
			// 把动态密匙保存在密文里，这也是为什么同样的明文，生产不同密文后能解密的原因
			// 因为加密后的密文可能是一些特殊字符，复制过程可能会丢失，所以用base64编码
			return $keyc.str_replace(array('+','/','='), array('-','_',''), base64_encode($result));
		}
	}
}

/**
 * PHP判断字符串纯汉字 OR 纯英文 OR 汉英混合
 * return 1: 英文
 * return 2：纯汉字
 * return 3：汉字和英文
 */
if(!function_exists("utf8_str")){
	function utf8_str($str){
		$mb = mb_strlen($str,'utf-8');
		$st = strlen($str);
		if($st==$mb)
			return 1;
		if($st%$mb==0 && $st%3==0)
			return 2;
		return 3;
	}
}
/**
 * 字符串截取，支持中文和其他编码
 * @static
 * @access public
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * @return string
 */
if(!function_exists("msubstr")){
	function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
		if(function_exists("mb_substr"))
			$slice = mb_substr($str, $start, $length, $charset);
		elseif(function_exists('iconv_substr')) {
			$slice = iconv_substr($str,$start,$length,$charset);
			if(false === $slice) {
				$slice = '';
			}
		}else{
			$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
			$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
			$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
			$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
			preg_match_all($re[$charset], $str, $match);
			$slice = join("",array_slice($match[0], $start, $length));
		}
		return $suffix ? $slice.'...' : $slice;
	}	
}

/**
 +----------------------------------------------------------
 * 字符串截取，支持中文和其他编码
 +----------------------------------------------------------
 * @static
 * @access public
 +----------------------------------------------------------
 * @param string $str 需要计算的字符串
 * @param string $charset 字符编码
 +----------------------------------------------------------
 * @return length int
 +----------------------------------------------------------
 */
if(!function_exists("abslength")){
	function abslength($str,$charset= 'utf-8'){
		if(empty($str)){
			return 0;
		}
		if(function_exists('mb_strlen')){
			return mb_strlen($str,'utf-8');
		}
		else {
			@preg_match_all("/./u", $str, $ar);
			return count($ar[0]);
		}
	}
}

//PHP去除Html所有标签、空格以及空白
if(!function_exists("cutstr_html")){
	function cutstr_html($str){
		$str = trim($str); //清除字符串两边的空格
		$str = strip_tags($str,""); //利用php自带的函数清除html格式
		$str = preg_replace("/\t/","",$str); //使用正则表达式替换内容，如：空格，换行，并将替换为空。
		$str = preg_replace("/\r\n/","",$str);
		$str = preg_replace("/\r/","",$str);
		$str = preg_replace("/\n/","",$str);
		$str = preg_replace("/ /","",$str);
		$str = preg_replace("/  /","",$str);  //匹配html中的空格
		return trim($str); //返回字符串
	}
}
/**
 +----------------------------------------------------------
 * 获取广告数据 通过广告类型ID
 +----------------------------------------------------------
 * @static
 * @access public
 +----------------------------------------------------------
 * @param string $typeid 
 +----------------------------------------------------------
 +----------------------------------------------------------
 */
if(!function_exists("query_ad_by_typeid")){
	function query_ad_by_typeid($typeid){
		$data = cache("ad_data_{$typeid}");
		if($data){
			return $data ;
		}
	
		$info = M("Adtype")->where("id='{$typeid}' and status = '1'")->find();
		if(!$info){
			return array();
		}
		$info['pic'] = ($info['pic'])?(C("upload_domain")."/Adtype/".$info['pic']):'';
		$info['updatetime'] = date("Y-m-d" ,$info['updatetime']);
		$info['addtime'] = date("Y-m-d" ,$info['addtime']);
		$result = M("Ad")->where("ad_type='{$typeid}'and status = '1'")->order("weight desc ")->select();
		$re = array() ;
		$last_data = array();
		if($result){
			$time = time();
			foreach($result as $k => $v ){
				if($v['begin_date'] > 0 && $v['end_date'] > 0 ){
					if($time > $v['end_date'] || $time < $v['begin_date']){
						continue ;
					}
				}
				$v['pic'] = ($v['pic'] != '')?C("upload_domain")."/Ad/".$v['pic']:$v['pic'];
				$v['pic2'] = ($v['pic2'] != '' )?C("upload_domain")."/Ad/".$v['pic2']:$v['pic2'];
				$v['addtime'] = date("Y-m-d H:i" , $v['addtime']);
				$v['begin_date'] = ($v['begin_date'] > 0)?date("Y-m-d H:i" , $v['begin_date']):0;
				$v['end_date'] = ($v['end_date'] > 0 )?date("Y-m-d H:i" , $v['end_date']):0;
				$re[] = $v ;
			}
			$last_data = array('info'=>$info , 'list'=>$re) ;
			S("ad_data_".$typeid , $last_data , 24*3600 , 'File' );
		}
		return $last_data ;
		
	}
}
/**
 * 检查密码格式
 * @author 王建
 * @param string $passwd
 * @return boolean
 */
if(!function_exists("checkPasswd")){
	function checkPasswd($passwd){
		if(preg_match("/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){5,16}$/",$passwd)){
			return true ;
		}
		return false ;
	}
}
/**
 * 检查用户名格式
 * @author 王建
 * @param string $passwd
 * @return boolean
 */
if(!function_exists("checkUsername")){
	function checkUsername($username){
		if(preg_match("/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){5,16}$/",$username)){
			return true ;
		}
		return false ;
	}
}

/**
 * 检查手机号码格式
 * @author 王建
 * @param string $mobile
 * @return boolean
 */
if(!function_exists("checkMobile")){
	function checkMobile($mobile){
		$search = "/^1[0-9]{10}$/i";
		if(preg_match($search,$mobile)) {
			return true ;
		}
		return false ;
	}
}
/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key  加密密钥
 * @param int $expire  过期时间 单位 秒
 * return string
 *
 */
if(!function_exists("think_encrypt")){
	function think_encrypt($data, $key = '', $expire = 0) {
		$key  = md5(empty($key) ? "speakphp.com" : $key);
		$data = base64_encode($data);
		$x    = 0;
		$len  = strlen($data);
		$l    = strlen($key);
		$char = '';
		for ($i = 0; $i < $len; $i++) {
			if ($x == $l) $x = 0;
			$char .= substr($key, $x, 1);
			$x++;
		}
		$str = sprintf('%010d', $expire ? $expire + time():0);
		for ($i = 0; $i < $len; $i++) {
			$str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1)))%256);
		}
		return str_replace(array('+','/','='),array('-','_',''),base64_encode($str));
	}
}
/**
 * 系统解密方法
 * @param  string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param  string $key  加密密钥
 * return string
 *
 */
if(!function_exists("think_decrypt")){
	function think_decrypt($data, $key = ''){
		$key    = md5(empty($key) ? "speakphp.com" : $key);
		$data   = str_replace(array('-','_'),array('+','/'),$data);
		$mod4   = strlen($data) % 4;
		if ($mod4) {
			$data .= substr('====', $mod4);
		}
		$data   = base64_decode($data);
		$expire = substr($data,0,10);
		$data   = substr($data,10);
		if($expire > 0 && $expire < time()) {
			return '';
		}
		$x      = 0;
		$len    = strlen($data);
		$l      = strlen($key);
		$char   = $str = '';
		for ($i = 0; $i < $len; $i++) {
			if ($x == $l) $x = 0;
			$char .= substr($key, $x, 1);
			$x++;
		}
		for ($i = 0; $i < $len; $i++) {
			if (ord(substr($data, $i, 1))<ord(substr($char, $i, 1))) {
				$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
			}else{
				$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
			}
		}
		return base64_decode($str);
	}
}
/**
 * 删除文件或者目录
 * @param  string $file 文件或者目录
 * return boolean
 *
 */
if(!function_exists("emDeleteFile")){
	function emDeleteFile ($file){
		if (empty($file))
			return false;
		if (@is_file($file))
			return @unlink($file);
		$ret = true;
		if ($handle = @opendir($file)) {
			while ($filename = @readdir($handle)){
				if ($filename == '.' || $filename == '..')
					continue;
				if (!emDeleteFile($file . '/' . $filename))
					$ret = false;
			}
		} else {
			$ret = false;
		}
		@closedir($handle);
		if ( file_exists($file) && !rmdir($file) ){
			$ret = false;
		}
		return $ret;
	}
}

